/*
  基于Socket本地域（Unix域）实现多进程通信的 
  对于每一个通信的进程，通过线程实现
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#include <unistd.h>
#include <string.h>

#include <pthread.h>
#include <stdlib.h>
#include <fcntl.h>

#define SOCK_PATH "/tmp/db2.sock"

int sfd; // 连接远程进程的套接字

void *read_task(void *arg){
   char buf[256] =  "";
   while(1){
       bzero(buf, 256);
       ssize_t len =read(sfd, buf, 256);
       if(len == 0) break;
        
       printf("----recv: %s---\n", buf);
   }
   return NULL;
}

void *send_task(void *arg){
   char buf[256] =  "";
   while(1){
       bzero(buf, 256);
       fgets(buf, 256, stdin);
       buf[strlen(buf)- 1] = 0;
       write(sfd, buf, 256);

       if(strncmp("exit", buf, 4) == 0) break;
   }
   return NULL;
}

int main(int argc, char const *argv[])
{
    sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(sfd == -1) return -1;

    struct sockaddr_un addr = {AF_UNIX, SOCK_PATH};
    if(connect(sfd, (struct sockaddr *)&addr, sizeof(addr)) != 0){
        perror("bind");
        return -1;
    }

    printf("--连接A端程序成功!--\n");

    pthread_t tid1, tid2;
    pthread_create(&tid1, NULL, read_task, NULL);
    pthread_create(&tid2, NULL, send_task, NULL);

    pthread_join(tid2, NULL);
    // 取消读消息的线程
    pthread_cancel(tid1);
    pthread_join(tid1, NULL);

    close(sfd);
    printf("--over--\n");

    return 0;
}
